/**
 * Created by geo on 17/4/18.
 */
/*
 单体模式在JavaScript中的应用:
 比如登录浮窗是唯一的,无论点击多少次登录按钮,浮窗只创建一次
 */

//Javascript的对象本身就是单例的,对象创建之后就是独一无二的
var single = {};

//单例类,每次new的时候都返回同一个对象(同一个)
function Universe(){
    //利用闭包
    var instance;

    //修改构造函数, 这样就不用使用return一个function来完成单例
    Universe = function Universe(){
        return instance;
    };

    //第一次执行时:
    //实例
    instance = new Universe();
    //设置构造函数
    instance.constructor = Universe;
    //所有功能
    instance.value = 1;
    console.log("call once");

    return instance;
}

var u1 = new Universe();
var u2 = new Universe();

console.log(u1.value);
console.log(u2.value);
console.log(u1.value === u2.value);
console.log(u1 === u2);
//call once
//1
//1
//true
//true





//通用惰性单例
function getSingle(fn){
    var instance;
    return function(){
        return instance || (instance = fn.apply(this, arguments));
    }
}

//需要获得单例的对象
function createLoginFrame(){
}
function createMyFrame(){
}

var createSingleLoginFrame = getSingle(createLoginFrame);
var createSingleMyFrame = getSingle(createMyFrame);

var l1 = createSingleLoginFrame();
var l2 = createSingleLoginFrame();

var m1 = createSingleMyFrame();
var m2 = createSingleMyFrame();

console.log(l1 === l2);
//true
console.log(m1 === m2);
//true